// 在Node中，每个模块内呗都有一个自己的module对象
// 该module对象中，一个成员叫export
// 如果你需要对外导出成员，只要把成员挂载导module.exports

// var module = {
//     exports: {

//     }
// }


// 谁来require我，就得到module.exports
// 默认在代码的最后一句
// return module.exports


// module.exports.foo = 'bar'
// module.exports.add = function (x, y) {

// }

// exports 和 module.exports一致, 上面可以简写成下面
exports.foo = 'bar'
exports.add = function (x, y) {

}

// 代码中有句 exports = module.exports

// 直接给export 赋值不管用, 最后return module.exports

// 如果对exports赋值，就不会指向 module.exports, 就会断开指向

// 可以直接对module.exports赋值

// 给exports赋值会丢失引用，给module.exports赋值也会丢失引用，但是最后return module.exports,exports就无用了


// {foo: bar}
exports.foo = 'bar'


// {foo: bar, a: 123}
module.exports.a = 123

// exports !== module.exports
// 最终 return 的是 module.exports
// 所以无论你 exports 中的成员是什么都没用
exports = {
  a: 456
}

// {foo: 'haha', a: 123}
module.exports.foo = 'haha'

// 没关系，混淆你的
exports.c = 456

// 重新建立了和 module.exports 之间的引用关系了
exports = module.exports

// 由于在上面建立了引用关系，所以这里是生效的
// {foo: 'haha', a: 789}
exports.a = 789

// 前面再牛逼，在这里都全部推翻了，重新赋值
// 最终得到的是 Function
module.exports = function () {
  console.log('hello')
}



// 真正去使用的时候：
//    导出多个成员：exports.xxx = xxx
//    导出多个成员也可以：module.exports = {
//                        }
//    导出单个成员：module.exports


// 谁来 require 我，谁就得到 module.exports
// 默认在代码的最后有一句：
// 一定要记住，最后 return 的是 module.exports
// 不是 exports
// 所以你给 exports 重新赋值不管用，
// return module.exports